15. MNOŽINA
Množina (set) je taká dátová štruktúra, ktorá obsahuje prvky rovnakého typu, ale bez usporiadania. Tento objekt je špecifickým pre Turbo Pascal, pomocou neho sa dá veľmi efektívne a elegantne riešiť niektoré problémy.
Pri deklarácií množiny vychádzame vždy zo základného priestoru. Základný priestor v Pascale je vždy objekt ordinárneho typu, napr.
20..40
'0', '9 '
Char
Byte
Množinu tvoríme z prvkov takéhoto základného priestoru. Žiaľ v Turbo Pascale počet prvkov v základnom priestore môže byť maximálne iba 256 a teda aj ich poradové čísla budú len od 0 po 255.
Deklarácia množiny: Set Of ZákladnýPriestor
Napríklad:
Var | |
| H1 : Set Of 20..40 ; |
| H2 : Set Of '0', '9' |
| H3 : Set Of Char |
| H4 : Set Of Byte |
Premenné H1, H2, H3 a H4 sú typu množina.
Množiny v Pascale môžeme zadať aj tak, že jeho prvky uvedieme v hranatej zátvorke. Tento spôsob zadania množiny sa nazýva konštruktorom množiny. Prvkami môžu byť výrazy základného priestoru a teda v konštruktore množiny môžu byť aj premenné. Prvky nemusíme uvádzať usporiadane, ale ak to urobíme usporiadane - zápis bude prehľadnejším. Napr.:
[20..30] | |
[4,6,7] | |
[1..5,9,12,20..26] | |
['1'.. '3', '9'] | |
[I,I*10,I+2] | |
[] | { prázdna množina } |
Množinová konštanta je taký konštruktor množiny, ktorý obsahuje iba konštanty. Vo vyššie uvedených príkladoch až na príklad [I,I*10,I+2] sú všetky také.
V operáciách s množinami na oboch stranách znaku operácie sú množiny a výsledkom je tiež množina:
Zjednotenie | + |
Prienik | * |
Rozdiel | - |
Var | |
| H1, H2 : Set Of Byte ; |
... | |
H1 := [1,2,6] ; | |
H2 := [1,4..7] ; | |
Potom
H1+H2 = [1,2,4..7] | |
H1*H2 = [1,6] | |
H1-H2 = [2] | |
Môžeme množiny porovnávať. Na oboch stranách porovnávania sú množiny a výsledok je typu Boolean:
Identita | = |
Nerovnosť: | <> |
Podmnožina: | <= |
Nadmnožina: | >= |
Porovnávanie predchádzajúcich množín:
H1 = [1,2,6] | pravda |
H2 = [1,4,5,6,7] | pravda |
H1 <> H2 | pravda |
H1 >= H2 | nepravda |
H1 <= H2 | nepravda |
Naľavo od operácie čí je niečo prvkom (IN) danej množiny je prvok a napravo množina.
Výsledkom je logická hodnota:
If 2 In H1 Then ... | { pravda } |
If 2 In H1*H2 Then ... | { nepravda } |
Nasledujúce podmienky sú po dvojiciach rovnaké:
C In ['C', 'E', 'I', 'S']
(C='C') Or (C='E') Or (C='I') Or (C='S')
C In ['0'..'9']
(C>='0') And (C<='9')
Negácia je Not(Prvok In Množina)
Zápis "Prvok Not In Množina" je logickejší, ale pre prekladač neznámy a teda syntakticky nesprávny.
Priority operácií:
- Najvyššiu prioritu má prienik (*),
- potom idú zjednotenie a rozdiel (+, -),
- potom porovnávania (=, <>, <=, >=) a
- najnižšiu prioritu má kontrola byť prvkom (In).
V priradení vľavo je premenná typu množina a vpravo výraz typu množina. Činiteľmi sú konštruktory množiny resp. premenné typu množina a operáciami sú vyššie uvedené operácie s množinami, napr.:
Množinu nemôžeme pomocou Write vypísať.
Úloha
Zadávajme z klávesnice znaky, kým nestlačíme ESC. Potom zobrazme v abecednom poradí znaky, ktoré boli zadané a potom tie, ktoré neboli. Každé písmeno vypíšme iba raz a nerozlišujme veľké a malé písmená!
|
V tejto úlohe máme pozbierať v podstate veľké písmená. Teda základným priestorom budú všetky veľké písmená: 'A'..'Z'. Zdrojový program bude nasledujúci:
|